Conversation
Update the target Python version from 3.13.7 to 3.14.1: - pants.toml: interpreter_constraints - pyproject.toml: requires-python, python_executable, pythonVersion, venv
Upgrade packages with native extensions (pyo3/Rust/C) that require newer versions to build wheels for Python 3.14: - pydantic: 2.11.3 → 2.12.0 (pydantic-core pyo3 update) - orjson: 3.10.16 → 3.11.0 (cp314 wheels) - bcrypt: 4.2.0 → 5.0.0 (Python 3.14 support) - memray: 1.17.2 → 1.19.0 (Python 3.14 support) - valkey-glide: 2.0.1 → 2.2.0 (cp314 wheels) - msgpack: 1.1.0 → 1.1.2 (cp314 wheels) - multidict: 6.6.4 → 6.7.0 (Python 3.14 CI) - yarl: 1.19.0 → 1.22.0 (cp314 wheels) - hiredis: 3.0.0 → 3.3.0 (cp314 wheels) - setproctitle: 1.3.5 → 1.3.7 (Python 3.14 support) - aiohttp: 3.12.15 → 3.13.0 (free-threading support)
- Add scripts/fetch-ruff-version.py to fetch and print the ruff version table for use in pants.toml
…ro.py for SCIE builds
- In Python 3.14, we can remove parenthesis around multiple exception types without "as" expressions. Ruff applies this rule by default if its target version is recognized as 3.14.
9552aac to
4af738e
Compare
…hon 3.14.3 - Merge current main into the PR branch - Update all Python version references from 3.14.2 to 3.14.3 - Update PBS release from 20251209 to 20260325 - Update etcd-client-py to ~=0.5.1 (now has cp314 wheels) - Update docs (daily-workflows, os-preparation, READMEs) for 3.14.3 - Fix identity.py: replace removed _BaseNetwork with type alias, remove generic args from BaseIPNetwork usage sites - Regenerate all lockfiles (python, python-kernel, tool resolves) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Resolve python.lock conflict and regenerate for Python 3.14.3. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: octodog <mu001@lablup.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…/backend.ai into chore/python-3.14-upgrade
- Disable `untyped-decorator` error code globally in mypy config (mypy 1.19 split this from `misc`, causing hundreds of new errors from click/strawberry decorators) - Remove now-unused `# type: ignore[misc]` comments from 88 files where they only suppressed the old `untyped-decorator` subset - Fix unreachable statement in agent.py (pre-existing, surfaced by transitive dependency check) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace `sa.ext.asyncio.AsyncConnection` and `sa.ext.asyncio.create_async_engine` with direct imports — mypy cannot resolve attribute access on `sa.ext` subpackage. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Upgrades the repo’s baseline CPython to 3.14.3 (including python-build-standalone release bump), refreshes tool lockfiles, and applies compatibility tweaks across runtime deps and Strawberry GraphQL schema generation/config.
Changes:
- Bump interpreter constraints / metadata to CPython 3.14.3 and update related docs/scripts.
- Regenerate/update Pants tool lockfiles and tool pins (notably mypy + ruff).
- Apply Python 3.14 compatibility fixes (typing updates, federation config change, dependency bumps including explicit
sniffio).
Reviewed changes
Copilot reviewed 110 out of 118 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tools/towncrier.lock | Regenerated tool lock for CPython 3.14.3. |
| tools/setuptools.lock | Regenerated tool lock for CPython 3.14.3. |
| tools/mypy.lock | Regenerated mypy tool lock + dependency updates for 3.14. |
| tools/mypy-requirements.txt | Updates pinned mypy/pydantic/strawberry requirements for the tool resolve. |
| tools/build-macros.py | Updates scie Python/PBS versions used for builds. |
| tools/black.lock | Regenerated Black tool lock for CPython 3.14.3 and updated transitive pins. |
| tests/unit/manager/health/test_database.py | Adjusts SQLAlchemy async engine import usage in tests. |
| tests/unit/agent/test_config_validation.py | Fixes pytest fixture method signature in class context. |
| src/ai/backend/README.md | Updates Python version references (but Pants version info needs alignment—see comment). |
| src/ai/backend/manager/repositories/auth/db_source/db_source.py | Replaces deprecated SQLAlchemy async connection type reference with AsyncConnection. |
| src/ai/backend/manager/api/gql/vfs_storage.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/vfolder.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/vfolder_v2/types/nested.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/vfolder_v2/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/user/types/node.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/user/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/user/resolver/mutation.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/storage_namespace.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/session/types.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/session/resolver/session.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/service_catalog/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/schema.py | Updates federation config to federation_version="2.11" for Strawberry compatibility. |
| src/ai/backend/manager/api/gql/scheduling_history/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/scheduler.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/runtime_variant/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/runtime_variant_preset/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_usage/types/user_usage.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_usage/types/project_usage.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_usage/types/domain_usage.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_usage/resolver/user_usage.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_usage/resolver/project_usage.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_usage/resolver/domain_usage.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_slot/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_preset/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_policy_v2/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_policy_v2/resolver/mutation.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_group/types.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_group/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/resource_allocation/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/reservoir_registry.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/rbac/types/role.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/rbac/types/permission.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/rbac/types/entity.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/rbac/resolver/role.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/rbac/resolver/permission.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/rbac/resolver/entity.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/prometheus_query_preset/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/prometheus_query_preset/resolver/mutation.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/project_v2/types/node.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/project_v2/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/project_v2/resolver/mutation.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/object_storage.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/notification/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/model_card/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/login_session/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/login_history/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/keypair/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/keypair/resolver/mutation.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/kernel/types.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/kernel/resolver/kernel.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/image/types.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/image/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/huggingface_registry.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/fair_share/types/user.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/fair_share/types/project.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/fair_share/types/domain.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/fair_share/types/common.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/fair_share/resolver/user.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/fair_share/resolver/project.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/fair_share/resolver/domain.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/domain_v2/types/node.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/domain_v2/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/domain_v2/resolver/mutation.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/types/route.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/types/revision.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/types/replica.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/types/deployment.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/resolver/route.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/resolver/revision.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/resolver/revision_preset.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/resolver/replica.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/resolver/policy.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/resolver/deployment.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/resolver/auto_scaling.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/deployment/resolver/access_token.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/container_registry/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/container_registry/resolver/mutation.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/background_task.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/audit_log/types/node.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/audit_log/resolver/query.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/artifact/types.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/artifact/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/artifact_registry.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/app_config.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/agent/types.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/manager/api/gql/agent/resolver.py | Removes no-longer-needed type: ignore[misc] annotations. |
| src/ai/backend/install/README.md | Updates hardcoded venv path to 3.14.3. |
| src/ai/backend/common/identity.py | Updates IP network typing for Python 3.14 compatibility (drops removed _BaseNetwork). |
| src/ai/backend/common/events/dispatcher.py | Removes no-longer-needed type: ignore[misc] annotations on decorators. |
| src/ai/backend/common/distributed.py | Removes no-longer-needed type: ignore[misc] annotations on decorators. |
| src/ai/backend/agent/docker/kernel.py | Adds explicit type annotation for config variable. |
| src/ai/backend/agent/docker/agent.py | Removes no-longer-needed type: ignore[misc] annotations on decorator. |
| src/ai/backend/agent/agent.py | Simplifies preopen_ports defaulting. |
| scripts/python.sh | Updates scripted Python version to 3.14.3. |
| scripts/pyscript.sh | Updates scripted Python version to 3.14.3. |
| scripts/fetch-ruff-version.py | Adds helper script to generate Pants ruff known_versions entries. |
| requirements.txt | Updates dependency pins for Python 3.14 compatibility and adds sniffio. |
| README.md | Updates top-level Python/Pants version requirements text. |
| pyproject.toml | Updates requires-python, tool configuration (ruff target-version, mypy/pyright python versions/paths). |
| pants.toml | Updates interpreter constraints, universe, and ruff version/known_versions; already sets Pants 2.29.0. |
| docs/manager/graphql-reference/v2-schema.graphql | Updates federation spec link version. |
| docs/manager/graphql-reference/supergraph.graphql | Updates join spec version and adds new directive input types/scalars. |
| docs/install/install-from-package/os-preparation.rst | Updates PBS/Python download example and venv creation command to 3.14.3. |
| docs/dev/daily-workflows.rst | Updates example tool export paths and lockset usage for 3.14.3. |
| changes/7199.enhance.md | Adds towncrier fragment for the Python 3.14.3 upgrade. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| | Backend.AI Version | Python Version | Pantsbuild Version | | ||
| |:------------------|:--------------|:-------------------| | ||
| | 25.06.x ~ (main) | 3.13.x | 2.27.x | | ||
| | 25.06.x ~ (main) | 3.14.x | 2.27.x | | ||
| | 24.03.x ~ 25.05.x | 3.12.x | 2.21.x | | ||
| | 23.03.x / 23.09.x | 3.11.x | 2.19.x | | ||
| | 22.03.x / 22.09.x | 3.10.x | - | | ||
| | 21.03.x / 21.09.x | 3.8.x | - | | ||
|
|
||
| **Current main branch**: | ||
| - Python: CPython 3.13.7 | ||
| - Python: CPython 3.14.3 | ||
| - Pantsbuild: 2.27.0 | ||
| - Versions defined in `pants.toml` |
There was a problem hiding this comment.
This README’s Pantsbuild version info is now inconsistent with the repository’s actual Pants version. pants.toml sets pants_version = "2.29.0", but this table and the “Current main branch” section still say 2.27.x / 2.27.0. Please update these entries to match the configured Pants version.
Use `PYVER="3.14"` instead of `PYVER="3.14.3"` in pyscript.sh and python.sh so that uv can resolve to the best available 3.14.x interpreter even when its download registry doesn't have the exact patch version yet. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Align README version table and "Current main branch" section with the actual pants_version = "2.29.0" in pants.toml. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Review: No-GIL / Free-Threaded Python ReadinessThe PR itself looks good as a Python 3.14.3 compatibility upgrade. The code changes are straightforward — However, since Python 3.14 ships with experimental free-threaded build support ( Global Mutable State Without SynchronizationThese module-level dicts are mutated at runtime without locks — safe under GIL, but racy under free-threaded mode:
Already Correct
Suggestions for Future Work
No blocking concerns for this PR as-is. |
Resolve conflicts in requirements.txt and python.lock: - Added authlib~=1.3.2 and httpx~=0.27.0 from main - Kept PR's version pins (asyncpg~=0.31.0, bcrypt~=5.0.0, etc.) - Merged both cp314 and cp313 charset_normalizer wheels in lockfile Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Resolve merge conflicts: - GQL resolvers: keep main's admin_ renames + PR's type: ignore removal - schema.py: keep PR's federation_version="2.11" - Lock files: keep PR branch versions (requires Python 3.14 to regenerate) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
resolves #7199 (BA-3306)
pants.tomlpyproject.tomltools/build-macros.pyscripts/python.shscripts/pyscript.shdocs/dev/daily-workflows.rstdocs/install/install-from-package/os-preparation.rstsrc/ai/backend/README.md,src/ai/backend/install/README.md,README.mdUpgrade pex: 2.50.4 → 2.74.1 (for pip 25.2 → 25.3)sniffioas an explicit dependency (upstream issue: Dependencies: sniffio is missing from glide dependencies - Python valkey-io/valkey-glide#5017)scripts/fetch-ruff-version.pyfor convenient upgrade in the future[tool.ruff].target-version = "py313"inpyproject.tomlfor backport compatibilityetcd-client-pyto ~=0.5.1 for Python 3.14 compatible wheels_BaseNetworkwithtype BaseIPNetwork = IPv4Network | IPv6Networkfederation_version="2.11"for strawberry-graphql compatibility📚 Documentation preview 📚: https://sorna--7200.org.readthedocs.build/en/7200/
📚 Documentation preview 📚: https://sorna-ko--7200.org.readthedocs.build/ko/7200/